/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.unl.asa.modelo;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author USUARIO TERAN
 */
public class GramaticaAsendente {

    private List<Character> lista;
    private List<Character> pila;

    /**
     *
     */
    public GramaticaAsendente() {
        pila = new ArrayList();
    }

    /**
     * Calcula los primeros de <b>La Cadena</b>
     *
     * @param ll 
     * @param gramatica2 
     */
    public void validarCadena(List<Character> ll, Gramatica2 gramatica2) {
        lista = ll;
        lista.add('$');
        pila.add('$');
        for (int i = 0; i < lista.size(); i++) {
            bandera = false;
            pila.add(lista.get(i));
            String cadenapila = "";
            for (int j = 1; j < pila.size(); j++) {
                cadenapila = cadenapila + pila.get(j);
            }

            //buscar la gramatica.
            cadenaPresentarPanel = (cadenaPresentarPanel + "Estado actual de la pila: ---> " + cadenapila + "\n");
            encontrargramaticaderecha(cadenapila, gramatica2);
            while (bandera == false) {
                try {
                    cadenapila = cadenapila.substring(1);
                    encontrargramaticaderecha(cadenapila, gramatica2);
                } catch (Exception e) {
                    bandera = true;
                }
            }
        }
    }
    boolean bandera = false;
    private String cadenaPresentarPanel = "";

    /**
     * Calcula los primeros de <b>Busca la gramatica correspondiente</b>
     *
     * @param String cadenapi
     * @param Gramatica2 gramatica2
     * @return
     */
    private void encontrargramaticaderecha(String cadenapi, Gramatica2 gramatica2) {
        if (cadenapi.equalsIgnoreCase("") || cadenapi.length() == 0) {
            bandera = true;
        } else {
            for (int j = 0; j < gramatica2.getPs().size(); j++) {
                if (cadenapi.equals(gramatica2.getPs().get(j).parteDerecha)) {

                    int x = pila.size() - 1;
                    for (int k = 0; k < cadenapi.length(); k++) {
                        pila.remove(x);
                        x--;
                    }
                    pila.add(gramatica2.getPs().get(j).noTerminal);
                    cadenaPresentarPanel = cadenaPresentarPanel + "Regla Aplicada: se reduce (" + cadenapi + ") por la Produccion: " + gramatica2.getPs().get(j).noTerminal + "\n";
//                    System.out.println("remplaza " + cadenapi + " por " + gramatica2.getPs().get(j).noTerminal);
                    bandera = true;
                }
            }
        }
    }
    private List<Character> pilainvertida;

    /**
     *
     * @return
     */
    public List<Character> getLista() {
        return lista;
    }

    /**
     *
     * @param lista
     */
    public void setLista(List<Character> lista) {
        this.lista = lista;
    }

    /**
     *
     * @return
     */
    public List<Character> getPila() {
        return pila;
    }

    /**
     *
     * @param pila
     */
    public void setPila(List<Character> pila) {
        this.pila = pila;
    }

    /**
     *
     * @return
     */
    public List<Character> getPilainvertida() {
        return pilainvertida;
    }

    /**
     *
     * @param pilainvertida
     */
    public void setPilainvertida(List<Character> pilainvertida) {
        this.pilainvertida = pilainvertida;
    }

    /**
     *
     * @return
     */
    public String getCadenaPresentarPanel() {
        return cadenaPresentarPanel;
    }

    /**
     *
     * @param cadenaPresentarPanel
     */
    public void setCadenaPresentarPanel(String cadenaPresentarPanel) {
        this.cadenaPresentarPanel = cadenaPresentarPanel;
    }
}
